package main

import (
	"fmt"
	"log"
	"p2p-server/pkg/server"
	"time"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
	// 创建HTTP服务器
	s := g.Server()

	// 设置WebSocket处理器
	s.BindHandler("/ws", func(r *ghttp.Request) {
		// 升级为WebSocket连接
		ws, err := r.WebSocket()
		if err != nil {
			log.Printf("WebSocket升级失败: %v", err)
			return
		}

		// 创建增强版WebSocket连接（支持重连和消息队列）
		conn := server.NewWebSocketConnWithURL(ws, "ws://localhost:8080/ws")

		// 监听连接事件
		conn.On("message", func(data []byte) {
			fmt.Printf("收到消息: %s\n", string(data))
			
			// 回复消息（使用队列发送）
			response := fmt.Sprintf("服务器收到: %s", string(data))
			if err := conn.SendQueued(response); err != nil {
				log.Printf("发送消息到队列失败: %v", err)
			}
		})

		// 监听重连事件
		conn.On("reconnect_attempt", func(attempt int) {
			fmt.Printf("正在尝试重连，第 %d 次\n", attempt)
		})

		conn.On("reconnected", func() {
			fmt.Println("重连成功")
		})

		conn.On("reconnect_failed", func() {
			fmt.Println("重连失败，已达到最大重连次数")
		})

		// 监听关闭事件
		conn.On("close", func(code int, reason string) {
			fmt.Printf("连接关闭: code=%d, reason=%s\n", code, reason)
		})

		// 启动消息读取
		go conn.ReadMessage()

		// 定期发送状态信息
		go func() {
			ticker := time.NewTicker(10 * time.Second)
			defer ticker.Stop()

			for {
				select {
				case <-ticker.C:
					if conn.IsConnected() {
						status := fmt.Sprintf("状态更新 - 队列大小: %d, 重连次数: %d, 时间: %s",
							conn.GetQueueSize(),
							conn.GetReconnectCount(),
							time.Now().Format("15:04:05"))
						
						if err := conn.SendQueued(status); err != nil {
							log.Printf("发送状态信息失败: %v", err)
						}
					}
				}
			}
		}()

		// 保持连接活跃
		select {}
	})

	// 设置静态文件服务
	s.SetServerRoot("/Users/a0000/workspace/webrtc/p2p-server/web")

	fmt.Println("增强版WebSocket服务器启动在 :8080")
	fmt.Println("功能特性:")
	fmt.Println("- 自动重连机制")
	fmt.Println("- 消息队列缓冲")
	fmt.Println("- 心跳检测")
	fmt.Println("- 连接状态管理")
	fmt.Println("- 并发安全")

	// 启动服务器
	s.SetPort(8080)
	s.Run()
}